package com.lagou.edu.interceptor;


import com.lagou.edu.dao.AccountDao;
import com.lagou.edu.pojo.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 自定义springmvc拦截器
 */
public class MyIntercepterLogin implements HandlerInterceptor {
    @Autowired
    private AccountDao accountDao;

    /**
     * 会在handler方法业务逻辑执行之前执行
     * 往往在这里完成权限校验工作
     *
     * @param request
     * @param response
     * @param handler
     * @return 返回值boolean代表是否放行，true代表放行，false代表中止
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyIntercepter01 preHandle......");

        //得到session对象
        HttpSession session = request.getSession(false);

        if (session.getAttribute("loginName") == null) {
            // 没有登陆过
            String userName = request.getParameter("userName");
            String passWord = request.getParameter("passWord");
            if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(passWord)) {
                //帐号密码错误，跳转到登录页面
                response.sendRedirect("/");
                return false;

            } else {
                Account account = new Account();
                account.setPassWord(passWord);
                account.setName(userName);
                Example<Account> example = Example.of(account);
                List<Account> accounts = accountDao.findAll(example);

                if (accounts != null && accounts.size() > 0) {

                    // 把用户数据保存在session域对象中
                    session.setAttribute("loginName", userName);
                    session.setMaxInactiveInterval(60);
                    /**
                     * 转发和重定向的区别：
                     *
                     * 重定向：以前的response中存放的变量全部失效，并进入一个新的response作用域。
                     *
                     * 转发：以前的request中存放的变量不会失效，就像把两个页面拼到了一起。
                     *
                     * 重定向是两次请求，重定向后地址栏变为第二次请求的页面，但是response重定向没有rutern
                     *
                     * 而转发之后地址栏地址不变，请求还是第一次的地址
                     */
                    request.getRequestDispatcher("/resume/queryAll").forward(request, response);
                }else {
                    //没有登录成功，跳转到登录页面
                    response.sendRedirect("/");
                    return false;
                }
            }

        } else {
            // 之前已经登陆过
            //取出会话数据
            String loginName = (String)session.getAttribute("loginName");
            if(loginName==null){
                //没有登录成功，跳转到登录页面
                response.sendRedirect("/");
                return false;
            }
        }
        return true;
    }


    /**
     * 会在handler方法业务逻辑执行之后尚未跳转页面时执行
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView 封装了视图和数据，此时尚未跳转页面呢，你可以在这里针对返回的数据和视图信息进行修改
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyIntercepter01 postHandle......");
    }

    /**
     * 页面已经跳转渲染完毕之后执行
     *
     * @param request
     * @param response
     * @param handler
     * @param ex       可以在这里捕获异常
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyIntercepter01 afterCompletion......");
    }
}
